#include <iostream>
#include <thread>
#include <mutex>
#include <string>

/*
单例模式确保某个类只能创建一个实例，且是全局唯一的
这就造成了多线程环境中的线程安全问题
*/

// 创建一个日志类
class Log {
private:
        static Log* log;  // 饿汉模式，直接全局定义对象，线程安全
public:
    Log() {};
    Log(const Log& log) = delete;   // 禁用拷贝构造函数
    Log& operator=(const Log& log) = delete;    // 禁用等号操作符

    // // 懒汉模式获取实例
    // static Log& GetInstance() {
    //     static Log* log = nullptr; // 调用默认无参构造函数初始化对象；这里只在程序调用时创建，就叫做懒汉模式
    //     if (!log) log = new Log;  // 相当于 log == nullptr  线程不安全
    //     return *log;
    // }

    // 饿汉模式获取实例
    static Log& GetInstance() {
        if (!log) log = new Log();
        return *log;     // 提前创建好静态变量，一调用就返回实例，就叫做饿汉模式
    }

    // 打印日志
    void PrintLog(std::string msg) {
        std::cout << __TIME__ << ": " << msg << std::endl;
    }
};


int main() {

    Log::GetInstance().PrintLog("error");
     
    return 0;
}

Log* Log::log = nullptr; // 定义全局变量